#include "types.h"
#include "riscv.h"
#include "defs.h"

// UART寄存器地址定义
#define UART0 0x10000000L
#define UART0_IRQ 10

// UART寄存器偏移量
#define RHR 0                 // 接收保持寄存器 (read)
#define THR 0                 // 发送保持寄存器 (write)
#define LCR 3                 // 线路控制寄存器
#define LSR 5                 // 线路状态寄存器

// LSR位定义
#define LSR_RX_READY (1<<0)   // 输入已就绪
#define LSR_TX_IDLE (1<<5)    // 发送器空闲

// 初始化UART
void
uartinit(void)
{
  
}

// 向UART发送一个字符
void
uart_putc(char c)
{
    // 检查THRE位，等待发送缓冲区空闲
    while((readb(UART0 + LSR) & LSR_TX_IDLE) == 0);
  
    // 发送字符
    writeb(UART0 + THR, c);
}

void 
uart_puts(const char *s, int len) {
    for (int i = 0; i < len; i++) {
        uart_putc(s[i]);
    }
}

// 从UART读取一个字符
int
uart_getc(void)
{
  if(readb(UART0 + LSR) & LSR_RX_READY){
    return readb(UART0 + RHR);
  } else {
    return -1;
  }
}

// 向内存映射的I/O地址写入一个字节
void
writeb(uint64 addr, uint8 value)
{
  volatile uint8 *target = (volatile uint8 *)addr;
  *target = value;
}

// 从内存映射的I/O地址读取一个字节
uint8
readb(uint64 addr)
{
  volatile uint8 *target = (volatile uint8 *)addr;
  return *target;
}